9、合宙Air模块Luat开发:认识NVS数据管理模块 您所在的位置:网站首页 ⅰnne core下载1122 9、合宙Air模块Luat开发:认识NVS数据管理模块

9、合宙Air模块Luat开发:认识NVS数据管理模块

2023-06-10 13:22| 来源: 网络整理| 查看: 265

目录

点击这里查看所有博文

本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。

先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获 我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!

一、前言 1.1、NVS 介绍

NVS: Non-volatile storage , 即将数据存储到 flash 中, 掉电或重启后数据仍然存在, flash 类似于 PC 上磁盘。 Air720SL 上提供 nvs 接口给用户, 来保存和读取用户数据. 具体参考 nvm.lua,本接口不适合大容量数据的存储管理,如果数据量超过10K,建议直接使用io接口操作文件来管理。

1.2、NVS 优势

擦写均衡, 使 flash 寿命更长 NVS 在操作少量数据上, NVS 分区更大时, 擦写均衡表现的更为明显.。 例如: flash 一个 sector 为 4KB, NVS 分配大小为一个 sector, 写同一个 64 Bytes 数据到 flash, 分别比较spi_flash_xxx 和 nvs 写 64 次。

spi_flash_write: 每次写 flash 前, 需擦除 flash. 对应: 64 次擦除 flash, 64 次写 flash。 nvs: nvs 内部有擦写均衡, 有标志位记录当前有效存储. 如第一次擦除 sector, 再写 sector 0-63 Byte, 第二次写 sector 64-127 Bytes, 第 64 次(4KB/64Bytes) 写完 sector 最后一个 64 Byte. 对应: 1 次擦除 flash, 64 次写 flash。 这样 NVS 减少 64 倍擦除操作, 对 flash 寿命有较大提升. 在 NVS 分区更大, 存储信息少时, 表现的更为明显.。

以上内容引用espressif的ESP8266/ESP32 NVS 基本操作有兴趣的自行了解

1.3、NVS数据管理模块 NVS是通过config.lua文件进行数据初始化的,这个文件只在第一次运行时有效,需要提前把要存储的键值对放进去才能使用,不能在程序随意添加其他的键值对,只能修改文件中提前写好的para.lua:每次开机初始化时,如果para.lua不存在,则从config.lua复制出一个文件,重命名为para.lua,在程序运行过程中,写参数都是操作这个para.lua本例程config.lua提前定义了如下几个变量,有string类型、有numble类型、有bool类型、有table类型,平时常用的变量基本都有,也可以自行添加其他变量 module(...) strPara = "str1" numPara = 1 boolPara = false tablePara = {"item1-1","item1-2","item1-3"}

注意:重新下载会清空数据存储区,旧数据会被清空

二、编写测试程序

nvs在luat中封装的很简单,几乎可以认为是无脑,对着例程看一下就知道怎么用,一共就涉及到了三个函数,分别是

nvm.init(“config.lua”)–初始化nvs模块nvm.get(“strPara”)–读取键值对,该键值对必须提前在config中定义nvm.set(“strPara”, “str2”)–设置键值对,前提是存在这个键值对

完整的测试代码如下,测试代码中分别对string类型、numble类型、bool类型、table类型进行了设置和读取。

--必须在这个位置定义PROJECT和VERSION变量 --PROJECT:ascii string类型,可以随便定义,只要不使用,就行 --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义 PROJECT = "LED" VERSION = "0.0.1" require "sys" --加载日志功能模块,并且设置日志输出等级 --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可 require "log" LOG_LEVEL = log.LOGLEVEL_TRACE require "config" require "nvm" local function Test_Task() while true do log.info("Test_Task_run") local num = nvm.get("numPara") num = num + 1 nvm.set("numPara", num) log.info("numPara",num) sys.wait(2000) end end local function user_main() sys.wait(10000) nvm.init("config.lua") nvm.set("strPara", "str2") nvm.set("boolPara", false) nvm.set("tablePara", {"item2-1", "item2-2", "item2-3"}) log.info("testNvm.strPara", nvm.get("strPara")) log.info("testNvm.boolPara", nvm.get("boolPara")) local tableValue = nvm.get("tablePara") log.info("testNvm.tablePara", tableValue[1], tableValue[2], tableValue[3]) sys.taskInit(Test_Task) end --启动系统框架 sys.taskInit(user_main) sys.init(0, 0) sys.run() 三、下载测试程序到开发板

下载时要注意的是必须带上config.lua才能正常使用 在这里插入图片描述 下载完成打开监视端口,读写正常

[2020-04-02 21:51:31.742] [I]-[nvm.set] true strPara str2 nil nil [2020-04-02 21:51:31.753] [I]-[nvm.set] false boolPara false nil nil [2020-04-02 21:51:31.757] [I]-[nvm.set] true tablePara table: 06fc3358 nil nil [2020-04-02 21:51:31.768] [I]-[testNvm.strPara] str2 [2020-04-02 21:51:31.772] [I]-[testNvm.boolPara] false [2020-04-02 21:51:31.782] [I]-[testNvm.tablePara] item2-1 item2-2 item2-3 [2020-04-02 21:51:31.788] [I]-[Test_Task_run] [2020-04-02 21:51:31.792] [I]-[nvm.set] true numPara 2 nil nil [2020-04-02 21:51:31.971] [I]-[numPara] 2 [2020-04-02 21:51:33.943] [I]-[Test_Task_run] [2020-04-02 21:51:33.947] [I]-[nvm.set] true numPara 3 nil nil [2020-04-02 21:51:33.953] [I]-[numPara] 3 [2020-04-02 21:51:35.960] [I]-[Test_Task_run] [2020-04-02 21:51:35.973] [I]-[nvm.set] true numPara 4 nil nil [2020-04-02 21:51:35.993] [I]-[numPara] 4 [2020-04-02 21:51:37.955] [I]-[Test_Task_run] [2020-04-02 21:51:37.959] [I]-[nvm.set] true numPara 5 nil nil

不会下载的点击这里,进去查看我的第二篇博文2、Air720SL模块Luat开发:第一个Luat的Hello World里面讲了怎么下载 这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有